|
|
Aujourd'hui, pas de débats
sanglants avec crachats et noms d'oiseaux à tout va qui finissent
en empoignades viriles. Hé ben oui, il faut savoir être sérieux
de temps en temps. D'autant plus que ce présent article risque fort
de conditionner à jamais votre avenir de programmeur (si, si !!!).
Mais comme le dit si bien mon élève Sherlock Holmes, seul
rosbif que je puisse saquer, mettons nous à la recherches d'indice
afin d'élucider cette turlupinente question.
1. Compilateurs et langages de programmation
2. Quelques langages de programmation généralistes
2.1.
L'assembleur
2.2.
Le B.A.S.I.C.
2.3.
Le C
2.3.1. Le cas C++
2.4.
Le Pascal
2.5.
Conclusion
1. Compilateurs et langages de programmation |
Comme vous le savez sans doute, toutes les informations parcourant les circuits de l'ordinateur sont au format binaire, c'est-à-dire qu'elles sont uniquement composées de 0 et de 1, seule langue comprise par le microprocesseur (cerveau de l'ordinateur). Ce qui les rend pratiquement illisibles par le cerveau humain
C'est dans ce souci de lisibilité qu'ont été mis au point les compilateurs. Ils permettent d'après un fichier source (dit aussi listing), compréhensible par l'homme (ou la femme), de produire un fichier composé uniquement de 0 et de 1 compréhensible par la machine (l'opération inverse, qui vise à transformer un fichier binaire en fichier exploitable par l'homme, est effectuée par un debugger ). Ainsi la suite binaire "1000101111000010" signifie en assembleur "mov ax, dx" soit "transfert d'un endroit de la mémoire (registre DX) dans un autre endroit de la mémoire (registre AX)". Avouez qu'il n'est pas simple de gérer de telles suites binaires. Le compilateur se charge de faire la traduction entre l'utilisateur et la machine afin de produire un fichier exécutable en binaire.
Chaque langage propose à ses utilisateurs la possibilité de commander directement l'ordinateur par des instructions spécifiques, des mots clés. L'ensemble de ces instructions soigneusement rédigées l'une après l'autre forment le fichier source, le listing. Le compilateur se chargera de traduire tout cela en langage machine (seule langue comprise par le cerveau de votre ordinateur chéri : le microprocesseur) afin de produire un fichier exécutable.
Mais alors, me direz-vous, pourquoi existe-t-il tant de langages de programmation alors qu'ils font tous la même chose ? En effet, il doit bien exister plusieurs dizaines de langages. Cette profusion n'a lieu d'exister que pour offrir un vaste choix auprès des utilisateurs (j'y décèlerais aussi une opportunité commerciale). On a ainsi des langages de programmation spécialement dédiés aux mathématiques (mise en oeuvre facilité du calcul d'une équation à n degrés, calculs d'intégrales...), à la 3D, à la gestion des sons, à la gestion des fichiers...
Beaucoup de ces langages sont ciblés. Mais la contrepartie à cette spécialisation est une moins bonne offre ou à une offre nulle dans un autre secteur. Ainsi ne vous attendez pas à programmer facilement du son sur le langage qui est spécialement dédié à la gestion de la 3D. L'utilisation de ce type de langage peut se révéler handicapente pour le futur. Si l'on veut passer à d'autres aspects de la machine, nous serions confrontés à une barrière que peu ont le courage d'affronter : l'obligation de réapprendre un autre langage. Nous mettrons ces types de langages en sourdines car trop pointus dans un seul domaine et négligeant trop allègrement les autres aspects de la machine.
Ils nous restent les autres : les généralistes.
Ils sont bien plus intéressants. Parole de Messire Hobocn. Ils offrent
un large éventail de possibilités et de par ce fait nous
permettrons de programmer, par nous même par la suite, les spécificités
dédiées à un langage spécialisé. Il
suffit alors d'un peu d'imagination pour arriver à nos fins. Car
après tout, un langage généraliste connu dans ses
moindres recoins permet de tout faire, je dis bien tout.
2. Quelques langages de programmation généralistes |
2.1. L'assembleur |
Appelé, accessoirement, langage machine, il est le plus puissant de tous, et de très très loin. C'est le langage le plus proche de la machine, c'est en quelque sorte sa langue maternelle. Avec lui on doit obligatoirement raisonner comme le microprocesseur. Ici, on ne manie pas des variables (sauf dans certains cas bien précis) mais les registres propres du microprocesseur (AX, BX, CX, DX...). Pas question de taper "PLAY DO#", comme on le ferait si aisément avec un simple Basic pour jouer la note do en dièse mais il faut directement programmer le circuit électronique de l'ordinateur spécialement dédié à cette tâche. Alors qu'avec le Basic ou le C on utilise des variables très facilement, ici on doit directement faire les transferts d'un emplacement mémoire physique à un autre et cela manuellement, etc...Tout est à la charge du programmeur. Ainsi on colle au plus près de la machine.
Contrairement à d'autres langages, ses instructions ont été fixées une bonne fois pour toutes et l'on ne peut en rajouter. L'apparition de nouvelles instructions se fait avec la sortie d'un nouveau microprocesseur. Mais cela est largement suffisant car toute manipulation sur un ordinateur n'est, à la base, qu'une suite de copies de données, de tests de comparaison et de sauts à une adresse.
Prenons un exemple simple: en Basic, lorsque l'on donne une valeur à une variable on écrit "age=12", et lorsque que l'on veut afficher un point à l'écran, on écrit "PixelPut X,Y,Couleur". Ces deux actions, qui semblent totalement différentes, ne sont en fait que des copies. En effet, dans le premier cas, on copie la valeur "12" dans l'emplacement mémoire réservé à "age" alors que dans le deuxième, on copie à l'emplacement mémoire vidéo "X,Y" la valeur du pixel de couleur "Couleur".
Alors que le Basic vous propose deux possibilités de copie (l'une dans une variable, l'autre sur l'écran), l'assembleur n'utilise qu'une seule possibilité qui somme toute peut effectuer les deux opérations précédentes. Lorsque le compilateur Basic ou C aura produit un fichier exécutable, les cheminements, les raisonnements seront les mêmes que ceux écrits en Assembleur.
Mais alors pourquoi programmer en Assembleur et se
casser la tête avec une logique difficile à appréhender
?
Là aussi la réponse est assez simple.
Reprenons nos précédents exemples. Dans le premier cas "age=12",
après que le compilateur Basic ait produit un fichier exécutable,
celui-ci sera en langage machine (je vous rappelle qu'un compilateur transforme
un fichier source en fichier binaire, seul langage compris par le microprocesseur),
on aura donc (mov signifie copie le contenu de ... dans ...) :
Les langages évolués offrent beaucoup de possibilités mais doivent impérativement se soumettre à cette limite car, après tout, une fois l'exécutable produit, il sera en langage binaire. Donc pour ne pas produire un exécutable bancal, les surcharges d'affectation sont omniprésentes. Dans le cas précédent, c'est le seul cas de figure où nous pouvons donner une valeur directe à une variable en assembleur. Si l'on programme en Assembleur, nous pouvons nous permettre d'écrire simplement "mov age, 12", mais le Basic ne le fera pas, il se servira du registre AX comme intermédiaire. C'est sa nature. Dans les autres cas, nous serons dans l'obligation de passer par l'intermédiaire d'un registre.
Lorsque nous programmons directement en Assembleur, c'est nous qui devons nous dépêtrer avec cette limitation et nous pouvons faire toutes les manipulations que nous voulons. Les risques de plantages sont alors plus nombreux qu'avec un langage évolué qui, lui, ne prend aucun risque.
Revenons à nos moutons. Donc une économie d'une instruction en assembleur. Je sais, vous allez me dire : "Ouais, mais moi j'ai un Pentium II à 333Mhz et ces deux instructions seront exécutées en 1/10n de secondes". Oui, c'est vrai pour ce cas de figure mais mettez vous dans le crâne que ce type d'opération est toujours appliqué lorsqu'il faut manier des copies de valeurs et comme le microprocesseur ne sait faire que ça, la surcharge est présente des milliers de fois dans un fichier exécutable écrit en Basic (et en C dans une moindre mesure). Mais voyons le second cas de figure.
Dans "PixelPut X, Y, Couleur", que va faire le Basic ? Il va tester si l'écran est en mode graphique par l'intermédiaire du BIOS (le circuit électronique le plus lent du PC), il va calculer les positions x, y (y*longueur_de_l'écran + x), puis copier la valeur du pixel à cette coordonnée. Si l'on veut afficher un autre pixel à l'écran, rebelote : test, calcul, copie. Si l'on veut afficher tous les pixels de l'écran, on se retrouve à faire au minimum 64000 fois la même procédure. C'est très très lourd mais surtout pesant pour le microprocesseur qui n'a pas que vous à s'occuper. Dans le cas de l'Assembleur, vous pouvez choisir de tester si l'écran est en mode graphique ou non et sans passer par le BIOS, les calculs peuvent être optimisés par diverses magouilles (technique de rotation binaire inconnu ou non acceptée par le Basic) et enfin la copie du pixel sera très rapide (comme dans l'exemple 1). Percevez-vous maintenant les avantages de l'Assembleur par rapport au Basic ? Je vous garantis que les temps d'exécution d'un programme écrit en Assembleur seront toujours, au minimum, plus de 500 fois plus rapides qu'un programme écrit en Basic.
Pour comprendre ce concept crucial de rapidité d'exécution, nous devons raisonner en terme de cycle d'horloge du microprocesseur de la machine. En effet, un programme exécutable, qu'il soit écrit en Basic ou en Assembleur, s'exécutera toujours à la même vitesse. Ce qui fait la différence entre ces deux langages est uniquement la surcharge d'affectation et les tests que le Basic fait dans votre dos. C'est dans un souci de ne pas planter la machine que le Basic teste si l'écran est en mode graphique. Mais il ne faut pas croire que le Basic va s'accaparer que quelques cycles d'horloge pour effectuer cette tâche, mais des milliers alors que le programmeur en assembleur, s'il sait raisonner comme la machine, peut économiser une très grande partie de ces cycles. C'est là l'avantage déterminant. La contrepartie, si le listing est mal écrit, est le rebootage de la machine (ça m'est arrivé des tas de fois).
Autre avantage de l'Assembleur : la taille du programme exécutable produit. Du fait qu'il y a très peu de tests (c'est à vous de les fixer) et pas de surcharge d'affectation, la taille est imbattable. Considérez qu'elle sera toujours au moins 10 fois plus petite que celle d'un Basic.
Etant aussi près de la langue du microprocesseur, l'Assembleur a le privilège de pouvoir bidouiller tous les aspects du PC (gérer le disque dur à votre convenance, faire tourner les lecteurs de disquettes deux fois plus rapidement, agir directement sur les fréquences d'horloge du microprocesseur, écrire votre propre DOS, et même pirater des jeux...).
La contrepartie à cette extrême vitesse et cette toute petite taille est la lenteur de mise en oeuvre d'un programme en Assembleur. La logique, la rigueur doivent toujours être au rendez-vous sous peine de plantage. Une connaissance très approfondie de la structure de la mémoire et des mécanismes de logique sont indispensables.
De plus, toutes les fonctions offertes par les langages dits évolués sont absentes. Pour lire un fichier, l'assembleur ne peut compter sur la fonction "0x.." , on doit obligatoirement passer par les interruptions du BIOS ou du DOS qui sont bien moins conviviales à mettre en oeuvre.
Vous pouvez compter au moins 10 fois plus de temps
de développement en assembleur qu'avec d'autres langages évolués.
C'est pour cela qu'écrire un programme 100% en Assembleur est une
folie (sauf pour les cadors). Il faut mieux écrire les parties critiques
du programme (affichages, tri, copie de blocs de mémoire...) en
Assembleur et le reste en langage évolué (Basic C Pascal...).
|
|
|
|
|
|
2.2. Le B.A.S.I.C. |
L'avantage de ce langage est la sécurité et la simplicité.
Il n'y a pratiquement aucun risque de planter la machine en écrivant son programme. Il est conçu de telle sorte que toutes les choses que vous lui faites faire sont, avant d'être exécutées, testées de fond en comble. Pourquoi ? Je viens de vous le dire : IL EST DESTINE A LA BLEUSAILLE !!!!!!. Ici ne craignez pas de faire rebooter le PC si vous écrivez quelque part dans un bloc de mémoire (contrairement à l'Assembleur et au C) ou il faut vraiment le vouloir. Le BASIC ne le fera pas ou vous en empêchera en refusant d'exécuter le programme.
Donc la première chose qui qualifie le BASIC est la sécurité de la rédaction du listing. Seulement, en contrepartie, cela se paie très cher : la lenteur de la vitesse d'exécution, c'est long de tester le programme de fond en comble. Le Basic est une sorte de grosse machine bureaucratique qui veut absolument s'assurer que vous ne sortez pas du cadre qu'il a lui-même défini (y aurait-il une influence de la doctrine soviétique ????). On peut même dire sans se tromper qu'il détient la palme de la lourdeur (un peu comme Window$).
La simplicité est son second avantage. Ici, pas besoin de calculer les coordonnées d'un pixel, pas besoin de savoir où sont situées les adresses mémoires pour interroger l'horloge, le calendrier, les disquettes et disques durs, pas besoin de se soucier du mode d'écriture ou de lecture d'un fichier, de la non fermeture d'un fichier, dans quel sens penche le joystick, à quelle position est la souris, si elle est branchée, il se charge de tout, même de ce que vous lui demandez pas ! Sa simplicité est due aussi à son très large éventail de fonctions fournies. Presque tous les aspects du PC sont gérés mais comme je le disais plus haut, cette simplicité et cette profusion de possibilités se paient par les gardes-fous qu'ils imposent à l'utilisateur.
Par exemple, le BASIC vous permet de jouer des notes de musique mais uniquement sur le PC-SPEAKER (enceinte dans la boite du PC), mais il est pratiquement impossible de jouer un fichier musical *.MOD ou une plage d'un CD-Audio via une carte SoundBlaster sans avoir recours à notre bon vieux Assembleur (tiens, le revoilà lui). En conclusion sur cette partie sur la simplicité, nous pouvons dire que le BASIC offre de grandes possibilités mais que tout ce qui ne fait pas partie de ses compétences originelles sont très sévèrement prohibées. Il n'accepte pas que l'on sorte du cadre que lui-même a fixé. C'est un code de loi à lui tout seul.
Autre lourdeur étrange : l'interpréteur. Nous avons parlé plus haut de ce qu'était un compilateur (transforme un fichier source en fichier binaire pour que le microprocesseur puisse le comprendre), mais le BASIC ne dispose pas d'un compilateur d'origine (livré séparément, il faut l'acheter, hé oui !) mais d'un interpréteur. Toujours par souci de sécurité, ce dernier est logé obligatoirement en mémoire et permet de faire fonctionner votre programme. L'avantage est de pouvoir exécuter le programme et de le stopper quand bon vous semble. Cette initiative somme toute louable ajoute à la lourdeur. Car l'interpréteur, au lieu de produire en une seule fois un fichier exécutable, va lire la première ligne de votre listing, la traduire en langage machine en mémoire puis l'exécuter, et ainsi de suite pour chacune des lignes. Si vous me permettez cette comparaison, c'est comme si un facteur prenait une lettre, la porte à l'adresse indiquée, puis revient à la poste pour faire la même chose avec la prochaine lettre. Signalons que seulement certains BASIC ont opté pour ce système, les derniers modèles (Visual Basic...) ne souffrent pas de cette connerie. Mais ne comptez pas rivaliser avec l'Assembleur ou le C une fois que vous aurez compilé votre programme.
Signalons que la portabilité d'un programme BASIC du PC vers un autre ordinateur est faible, mais bien souvent la syntaxe des instructions et des mots clés se rapprochent l'une de l'autre, ce qui rend le décodage simple avec un vulgaire bouquin.
Il n'en reste pas moins que pour débuter dans
la programmation, le BASIC reste une référence afin d'appréhender,
sans souci de plantage, les logiques, les notions de variables, de boucles,
de sauts, de testes de conditions, de fonctions, de gestion des fichiers...Lorsque
l'on est familier de ces choses-là, on peut passer en douceur et
à coup sûr au C ou au Pascal.
|
|
|
|
|
|
2.3. Le C / C++ |
Autre point fort et signe de pérennité pour l'avenir du C : l'existence d'un comité de normalisation qui entérine les diverses propositions de programmeurs afin d'améliorer le langage pour ses versions futures.
Ajoutons une dernière chose. Sachez que lorsque sort un nouveau système d'exploitation, une nouvelle machine, le premier langage de haut niveau disponible est un C et non un Pascal ou un Cobol (pouaaaa !!!).
Vous devez sans doute penser que la première
approche avec un tel langage doit être un chemin de croix. Et ben
pas du tout. Avec un bon bouquin, cela passe comme dans du beurre.
2.3.1. Le cas C++ |
La POO est une nouvelle forme de programmation qui tend à s'étendre de plus en plus avec l'arrivée de systèmes de plus en plus compliqués et multi-usages. De part sa philosophie, elle injecte le concept d'Objet. Mais cela est à relativiser pour le cas du langage C. La POO offerte n'est pas aussi pure et rébarbative que sur les langages Effel, Smalltalk ou Simula, mais plutôt un ersatz, un mariage, une harmonisation entre deux visions.
La POO trouve sa justification dans le fait que les systèmes deviennent de plus en plus pointus car doivent être multi-usages (cas de Window$ où il est possible de regarder une vidéo, d'écouter un CD...). La POO permet une protection du programme qui s'exécute et des données qui lui sont rattachées. Par le système d'encapsulation, les données ne peuvent être altérées, accessibles que dans des cas bien précis. Cette technique apporte une protection générale du programme.
Le second apport de la POO est la mise à disposition de l'utilisateur d'Objets. Un Objet n'est rien d'autre qu'une grosse structure regroupant en son sein des fonctions et des données. Mais ces structures (appelées aussi Classes) contrairement aux structures d'un C classique, sont soumises au phénomène d'encapsulation (seules les fonctions faisant partie de cette structure peuvent agir sur ces données et inversement). Ces Objets , qui ne se justifient pas lorsque l'on travail sous DOS où toutes les ressources systèmes sont à votre botte, se révéleront très appréciables lorsque l'on voudra rédiger un programme tournant sur des plates-formes multi-tâches sans risque de conflits (sur Window$ notamment).
L'exemple le plus typique est sans doute la fenêtre classique Window$. S'il n'existait pas d'Objet "fenêtre", l'utilisateur serait dans l'obligation de concevoir lui-même cette fenêtre. Avec ce système, le C++ offre au programmeur la possibilité d'utiliser l'Objet pré-défini "fenêtre" par le système d'héritage et, le cas échéant, de modifier certaines des fonctions rattachées à cet Objet par le système de dérivation. On se crée, à partir d'un Objet standard pré-défini, son Objet à la carte (la fenêtre doit-elle être redimensionnable ? Combien de couleurs ? Peut-on la fermer, la bouger ? Quand doit-on la réafficher ? Etc...).
Pour terminer sur ce thème, je tiens à
couper court à une idée reçue. Dire qu'il vaut mieux
apprendre à programmer le C++ plutôt que le C est une pure
connerie. Le C++ n'est qu'un ajout, un sur-ensemble au C standard des possibilités
de la POO. Sans connaissances approfondies du C standard, la compréhension
du C++ et la rédaction d'un listing n'est pas possible. Une bonne
connaissance du C standard est impérative pour comprendre le concept
ardu et parfois déroutant de la POO. Sachez qu'il est tout à
fait possible d'écrire un programme Window$ sans utiliser une seule
possibilité du C++. Le C++ est une possibilité offerte pour
doter le programme d'une plus grande fiabilité, mais nullement une
voie incontournable.
|
|
|
|
|
|
2.4. Le Pascal |
Sa popularité, sur PC, vient d'abord de la qualité du compilateur développé par la Société Borland. Si l'on ajoute à cela la simplicité de ce langage d'apprentissage (comme le Basic), toutes les conditions étaient réunies pour que les ex-débutants continuent sur ce langage. A tel point qu'aujourd'hui, les sources d'exemples disponibles à tout un chacun sont innombrables, sans doute les plus fournies de tous les langages.
Un grand nombre de clubs informatiques et autres écoles supérieures (BTS, etc...) continuent d'enseigner ce langage (c'est dur de reformer un prof borné et soucieux d'en foutre le moins possible). L'effet boule de neige s'accentue.
Signalons encore au crédit du compilateur de Borland (uniquement sur PC) la possibilité de générer un code exécutable en mode protégé (donne accès à toute la mémoire du PC). Tous les compilateurs C ne supportent pas d'origine cet avantage mais après une petite magouille.
L'inconvénient principal du Pascal est sa
non évolution. Ainsi l'on trouve encore la différenciation
entre Procédure et Fonction (l'un renvoie une valeur retour et l'autre
non) alors que le C a depuis longtemps résolu ce problème.
Il souffre cruellement d'un manque de mise à jour flagrant (contrairement
au C avec le comité de normalisation). C'est bien pour cela que
les programmeurs Pascal passent assez vite au C après s'être
familiarisés avec les diverses logiques de programmation.
|
|
|
|
|
|
2.5. Conclusion |
Les échelons doivent être gravis un par un. Les sauter ne ferait qu'allonger l'apprentissage des notions les plus essentielles ou même les occulter pour finir par ne plus rien comprendre (dans ce cas là, restez plutôt au lit). Un Basic, même pourri, vous permettra d'appréhender ces logiques. Il faut impérativement en comprendre toutes les articulations : qu'est une variable, une boucle, un saut, un test de condition ? Non, vous ne perdrez pas votre temps. Il faut savoir qu'une boucle qu'elle soit en Basic, C ou Pascal relève toujours de la même démarche et conduira toujours au même résultat. Une fois comprise, seule la syntaxe change ainsi que quelques apports qui n'en seront que plus facilement assimilables.
Lorsque l'idée lumineuse d'inclure des modules assembleurs dans vos listings, qu'ils soient en Basic, Pascal ou C, vous aura traversé la cervelle, optez pour un compilateur Assembleur de la même marque que le langage de haut niveau utilisé.
Il est impératif de posséder un livre se rapportant au langage étudié. Il est important de comprendre tout ce que l'on fait. Les toutes petites lacunes accumulées aujourd'hui seront les énormes problèmes de demain (elle est nulle cette tournure de phrase ! Dire que mes parents voulaient que je sois prof ! Non ? Si !!!).
Je terminerai par quelques conseils d'usage.
Veillez tout d'abord à rédiger vos
listings proprement. Nommez vos variables d'une manière compréhensible,
espacez les fonctions, n'en mettez qu'une par ligne. Mettez des commentaires
en face des instructions. Ne faites pas :
mais,int a[10],z; for (z=0;z<10;z++){a[i]=i;}
Les commentaires sont très importants. Il est presque sûr que si vous vous repenchez sur un de vos listings rédigé quelques mois plus tard vous ne le comprendrez qu'après une intense débauche de concentration.int table [ 10 ], Cpt; for ( Cpt = 0; Cpt < 10; Cpt++ ) { table [ Cpt ] = Cpt; }
Dernier conseil : programmez en C.
3. Les cas Visual Xxx |
Ces nouveaux types de langages, que l'on qualifie pompeusement souvent de nouvelle génération n, ne sont donc en fait que des langages classiques sur lesquels on aurait greffé des possibilités permettant de supporter les innovations offertes par Window$. Ainsi, il est aisé de créer une fenêtre, d'afficher des dessins, de faire de cadre...
Il y a tout de même d'énormes points noirs à ce type de programmation.
Tout d'abord la taille des fichiers exécutables produits. Elle est excésivement énorme (1 méga-octet est bien souvent le revers de la médaille). Pourquoi ? Il faut bien que le programme stocke quelque part en son sein les définitions, les structure pour être compatible avec Window$. Avec cette technique, le programme est autonome. Bien souvent le langage vous permet de ne pas injecter les définitions dans le programme exécutable mais il faut alors veiller à ce que certains *.DLL(s) utilisés (par exemple VBRUN600.DLL pour VISUAL BASIC) soient installés sur le disque dur. Ce système permet de partager ces *.DLL(s) avec tous les programmes rédigés avec cette technique. D'où un gain de taille des fichiers très appréciable. Dans ce cas, le programme n'est pas autonome mais tributaire de certains fichiers (appelés aussi " librairies ").
Secundo, la lenteur de la vitesse de l'exécution. Le programme tournant sur la plate-forme Window$, qui est (théoriquement) multi-tâches, se voit imposer un partage des temps et des accès au BUS contrairement au DOS où l'on s'accappare (presque) toutes les ressources du système.
Apprendre à créer des fenêtres,
des boîtes de dialogues sous Window$ sans maîtriser les logiques
de programmations de bases (boucles, tests, sauts, variables...) est une
erreur. On aboutirait à une demi-compréhension de la manoeuvre.
Un simple message d'erreur s'avérera alors n'être que de l'Hébreux.
C'est l'une des causes de dégoût de la programmation parmi
ceux qui débutent.